package m3;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.client.producer.TransactionMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.Scanner;

public class Producer {
    public static void main(String[] args) throws MQClientException {
//        创建事务消息生产者
        TransactionMQProducer p = new TransactionMQProducer("producer3");
//        设置name server
        p.setNamesrvAddr("192.168.64.141:9876");
//        设置事务消息监听器
        p.setTransactionListener(new TransactionListener() {
//            执行本地事务的方法
            @Override
            public LocalTransactionState executeLocalTransaction(Message message, Object arg) {
                if(Math.random()<1){
                    return LocalTransactionState.UNKNOW;
                }


                System.out.println("执行本地事务："+arg);
                if (Math.random()<0.5){
                    System.out.println("本地事务成功，提交消息");
//                    为了之后处理消息回查，需要存储事务状态
                return LocalTransactionState.COMMIT_MESSAGE;
                }else {
                    System.out.println("本地事务失败，回滚消息");
                return LocalTransactionState.ROLLBACK_MESSAGE;
                }
//                return LocalTransactionState.UNKNOW;一般不会在本地事务方法中，直接返回这种状态
            }
//          用来处理Rocketmq 服务器的反向事务状态回查
            @Override
            public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
                System.out.println("服务器正在回查事务状态");
//                从数据库查询事务状态，再向服务器返回
                return LocalTransactionState.UNKNOW;
            }
        });
//        启动
        p.start();
//        发送事务消息，触发监听器，执行本地事务
        while (true){
            System.out.println("输入消息");
            String s = new Scanner(System.in).nextLine();
            Message msg = new Message("Topic3", s.getBytes());
            p.sendMessageInTransaction(msg,"参数");//第二个参数是本地事务需要的业务数据参数
        }
    }

}
